package top.lshaci.learning.springboot.jpa.config;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.json.JSONUtil;

import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * ModelMapper
 * <pre>
 *     使用方法：
 *     1、在 Repository 中定义返回值为 List&lt;Map&lt;String, Object&gt;&gt; 的方法
 *     <code>
 *
 *         public interface XxxRepository {
 *             List&lt;Map&lt;String, Object&gt;&gt; findAll();
 *         }
 *
 *     </code>
 *     2、使用 ModelMapper.mapping 将 List&lt;Map&lt;String, Object&gt;&gt; 数据转换为指定对象的集合
 * </pre>
 *
 * @author liangxu
 */
public class ModelMapper {

    /**
     * 将 Map 类型的集合，转换为指定对象类型集合
     *
     * @param dataList    Map 类型的集合数据
     * @param targetClass 目标类型
     * @param <T>         类型
     * @return 目标类型集合
     */
    public static <T> List<T> mapping(List<Map<String, Object>> dataList, Class<T> targetClass) {
        if (dataList == null) {
            return null;
        }
        if (dataList.isEmpty()) {
            return Collections.emptyList();
        }
        return JSONUtil.toList(JSONUtil.toJsonStr(dataList), targetClass);
    }

    /**
     * 将 Map 类型的数据，转换为指定对象类型
     *
     * @param data        Map 类型的数据
     * @param targetClass 目标类型
     * @param <T>         类型
     * @return 目标类型
     */
    public static <T> T mapping(Map<String, Object> data, Class<T> targetClass) {
        if (data == null) {
            return null;
        }
        if (data.isEmpty()) {
            return ReflectUtil.newInstance(targetClass);
        }
        return BeanUtil.copyProperties(data, targetClass);
    }
}
